package com.ht.api.db.hlink;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import com.ht.api.db.Db;
import com.ht.api.db.DbConfig;
import com.ht.api.db.Entity;
import com.ht.api.db.StreamLoadConfig;
import com.ht.api.db.task.HtTaskExecutor;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * Hlink模块入口
 * @author asq
 * @createTime 2025年1月10日 21:29:33
 */
@Slf4j
public class HlinkManager {
	/**
	 * 单个Entity插入时触发Hlink
	 * @param ds 目标数据源
	 * @param entity 源数据
	 */
	public static void start(DataSource ds, Entity entity) {
		start(ds, entity.getTable(), Arrays.asList(entity));
	}
	
	/**
	 * StreamLoad批量插入时，触发Hlink（多个表的dblist）
	 * @param config
	 * @param dataMap
	 */
	public static void start(StreamLoadConfig config, Map<String, List<Entity>> dataMap) {
		start(DbConfig.getDataSourceByStreamLoadConfig(config), dataMap);
	}
	
	/**
	 * jdbc批量插入时，触发Hlink（多个表的dblist）
	 * @param ds
	 * @param dataMap
	 */
	public static void start(DataSource ds, Map<String, List<Entity>> dataMap) {
		dataMap.entrySet().stream().forEach(entrySet -> {
			start(ds, entrySet.getKey(), entrySet.getValue());
		});
	}
	
	/**
	 * StreamLoad批量插入时，触发Hlink（同一个表的dblist）
	 * @param config
	 * @param table
	 * @param dataList
	 */
	public static void start(StreamLoadConfig config, String table, List<Entity> dataList) {
		DataSource ds = DbConfig.getDataSourceByStreamLoadConfig(config);
		start(ds, table, dataList);
	}
	
	/**
	 * jdbc批量插入时，触发Hlink（同一个表的dblist）
	 * @param ds
	 * @param table
	 * @param dataList
	 */
	public static void start(DataSource ds, String table, List<Entity> dataList) {
		// 不是租户库，立即退出
		if (!DbConfig.isTenant(table)) {
			return ;
		}
		
		// 空数据，立即退出
		if (dataList == null || dataList.isEmpty()) {
			return ;
		}
		
		// 渠道1：写source_data表
		if (!"open_data".equals(table) && !"source_data".equals(table)) {
			HtTaskExecutor.execute(() -> {
				List<Entity> sourceDataList = dataList.stream().map(o -> createSourceDataEntity(o)).toList();
				Db.insertBatch(ds, sourceDataList, false);
//				log.info("[Db.insert]自动保存source_data结束，源表：{}，源数据条数：{}，source_data条数：{}", 
//						table, dataList.size(), sourceDataList.size());
			});
		}
		
		// 渠道2：进入Hlink流程
		if (!"source_data".equals(table)) {
			if ("open_data".equals(table) && "1".equals(dataList.get(0).getStr("is_debug"))) {
				log.info("open_data表数据，is_debug=1，跳过hlink映射");
				return;
			}
			
			Hlink.execute(ds, table, dataList);
			//log.info("[Db.insert]触发Hlink流程，源表：{} 源数据条数：{}", table, dataList.size());
		}
	}
	
	/**
	 * 根据数据源Entity，创建一个要插入source_data表的Entity
	 * @param entity 数据源Entity
	 * @return
	 */
	private static Entity createSourceDataEntity(Entity entity) {
		String table = entity.getTable();
		String data = JSONUtil.toJsonStr(entity);
		return Entity.create("source_data").set("table_code", table).set("data", data);
		
	}
}
